home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / technowar.lha / data / techno / techno2.s < prev   
Text File  |  1990-09-13  |  41KB  |  2,173 lines

  1.     Section    Demo,Code_C
  2.  
  3.     Opt    C-,O+,w-
  4.  
  5.  
  6. headspeed    = 3    
  7. time        = 716*headspeed
  8. load        = 14            ; trap number to nondos load
  9.     
  10. Start:    
  11.     move.l    $80,a0
  12.     move.l    a0,volumespace    
  13.     add.l    #$18000,a0
  14.     move.l    a0,my_mem
  15.  
  16.     lea    loadtracks(pc),a0
  17.     move.l    a0,$80+(4*load)
  18.  
  19.     lea    $dff000,a5        ; hardware base address
  20.  
  21.     Move.w    $1c(a5),OldInt        ; Save Old Interupts
  22.     Move.w    $02(a5),OldDma        ; Save Old DMA
  23.  
  24.     Move.w    #$7fff,$9a(a5)        ; Clear DMA
  25.     Move.w    #$7fff,$96(a5)        ; Clear Interupts
  26.     Move.w    #$7fff,$9c(a5)        ; Clear Interupt Requests
  27.     
  28.     Move.l    $6c.w,OldV3        ; save level 3 int
  29.  
  30.     Move.l    #my_level3,$6c.w        ; put new copper interupt
  31.     Move.l    #my_copper,$80(a5)     ; Address of copper 1
  32.  
  33.     Move.w    #$e010,$9a(a5)        ; Start interupts
  34.     Move.w    #$83df,$96(a5)        ; Start DMA
  35.     Move.w    #1,$88(a5)        ; Strobe for copper start
  36.  
  37.     MOVE.L    #1773447,D7 ; PAL
  38.     move.l    d7,timervalue    
  39.     divu    #125,D7         ; Default to normal 50 Hz timer
  40.     move.w    d7,ciatime
  41.     move.l    $78,old
  42.     move.l    #l6int,$78
  43.     move.b    #$7f,$bfdd00
  44.     move.b    #%00010001,$bfde00    ; cra
  45.     move.b    #%10000001,$bfdd00    ; icr
  46.     move.b    ciatime+0,$bfd400
  47.     move.b    ciatime+1,$bfd500
  48.  
  49.     move.l    #main_screen,iff
  50.     bsr    show_iff
  51.  
  52.     bsr    loadmodule
  53.     add.l    #20,diskptr
  54.  
  55.     bsr    mt_init
  56.     st    mt_enable
  57.  
  58.     move.l    mt_data1,d0
  59.     move.l    mt_data2,d1
  60.     move.l    d0,mt_data2
  61.     move.l    d1,mt_data1
  62.  
  63. next_module:
  64.  
  65.     bsr    loadmodule
  66.     add.l    #20,diskptr
  67.  
  68. .wait    btst    #10,$dff016
  69.     bne    .ok
  70.     
  71.     bsr    mt_music
  72.     
  73. .ok
  74.  
  75.     btst    #6,$bfe001
  76.     beq    quit
  77.     cmp.w    #-1,songended
  78.     bne    .wait
  79.  
  80.     sf    mt_enable
  81.     bsr    mt_end
  82.     bsr    mt_init
  83.     st    mt_enable
  84.  
  85.     move.l    mt_data1,d0
  86.     move.l    mt_data2,d1
  87.     move.l    d0,mt_data2
  88.     move.l    d1,mt_data1
  89.  
  90.     move.l    diskptr,a6
  91.     cmp.l    #-1,(a6)
  92.     bne    next_module
  93.  
  94.     move.l    #diskmap,diskptr
  95.     bra    next_module
  96.     
  97. quit:
  98.     lea    $dff000,a5        ; hardware base address
  99.     move.l    #0,$80(a5)        ; blank copper list
  100.     move.l    #0,$84(a5)        ; if gfx lib not open (slayer boot)
  101.     move.w    #0,$180(a5)        ; bgc to black
  102.     
  103.     Move.l    OldV3,$6c.w        ; restore old l3
  104.     
  105.     bsr    mt_end
  106.     move.l    old,$78
  107.  
  108.     Lea    GfxLib,a1        ; Pointer to Library Text
  109.     move.l    4.w,a6
  110.     jsr    -132(a6)            ; forbid
  111.     Move.l    4.w,a6            ; Exec
  112.     Moveq.l    #0,d0            ; Clear D0
  113.     Jsr    -$228(a6)        ; Open Library
  114.     cmp.l    #0,d0
  115.     beq    no_gfx_lib        ; if gfx lib not open dont restore copper lib (slayer boot)
  116.     
  117.     Move.l    d0,a1            
  118.     Move.l    $26(a1),$80(a5)        ; restore copper 1
  119.     Move.l    $32(a1),$84(a5)        ; restore copper 2
  120. no_gfx_lib:
  121.  
  122.     Move.w    OldInt,d0        ; start old interupts
  123.     Or.w    #$8000,d0
  124.     Move.w    d0,$9a(a5)
  125.     Move.w    OldDma,d0        ; start old DMA
  126.     Or.w    #$8000,d0
  127.     Move.w    d0,$96(a5)
  128.     Move.b    #$9b,$bfed01        ; Start Timers
  129.     Move.l    4.w,a6            ; Close Gfx lib
  130.     Jsr    -$19e(a6)
  131.     move.l    4.w,a6
  132.     jsr    -138(a6)            ; permit
  133.  
  134.     move.w    #0,$bfec00        ; clear kbd
  135.  
  136.     Moveq.l    #0,d0            ; No errors
  137.     Rts                ; Exit
  138.  
  139.  
  140. my_level3:
  141.     Movem.l    d0-d7/a0-a6,-(a7)        ; New copper
  142.     Move.w    #$10,$dff09c        ; Serviced Interupt
  143.  
  144. Exit:    Movem.l    (a7)+,d0-d7/a0-a6
  145.     Rte                ; Return from Interupt
  146.  
  147.     *********
  148.  
  149. l6int:    move.w    #$2000,$dff09c
  150.     tst.b    $bfdd00
  151.  
  152.     move.w    ciatime,ciatime2
  153.     not.w    ciatime2
  154.     move.b    ciatime2+1,$bfe400
  155.     move.b    ciatime2+0,$bfe500
  156.  
  157.     bsr    mt_music
  158.  
  159.     rte
  160.  
  161. RealTempo    dc.w    125
  162. TimerValue    dc.l     0
  163. ciatime:        dc.l    0
  164. old:        dc.l    0
  165.  
  166.  
  167. n_note        EQU    0  ; W
  168. n_cmd        EQU    2  ; W
  169. n_cmdlo        EQU    3  ; B
  170. n_start        EQU    4  ; L
  171. n_length        EQU    8  ; W
  172. n_loopstart    EQU    10 ; L
  173. n_replen        EQU    14 ; W
  174. n_period        EQU    16 ; W
  175. n_finetune    EQU    18 ; B
  176. n_volume        EQU    19 ; B
  177. n_dmabit        EQU    20 ; W
  178. n_toneportdirec    EQU    22 ; B
  179. n_toneportspeed    EQU    23 ; B
  180. n_wantedperiod    EQU    24 ; W
  181. n_vibratocmd    EQU    26 ; B
  182. n_vibratopos    EQU    27 ; B
  183. n_tremolocmd    EQU    28 ; B
  184. n_tremolopos    EQU    29 ; B
  185. n_wavecontrol    EQU    30 ; B
  186. n_glissfunk    EQU    31 ; B
  187. n_sampleoffset    EQU    32 ; B
  188. n_pattpos    EQU    33 ; B
  189. n_loopcount    EQU    34 ; B
  190. n_funkoffset    EQU    35 ; B
  191. n_wavestart    EQU    36 ; L
  192. n_reallength    EQU    40 ; W
  193.  
  194. mt_init    move.w    #0,songended
  195.     move.l    mt_data1,A0
  196.     MOVE.L    A0,mt_SongDataPtr
  197.     MOVE.L    A0,A1
  198.     LEA    952(A1),A1
  199.     MOVEQ    #127,D0
  200.     MOVEQ    #0,D1
  201. mtloop    MOVE.L    D1,D2
  202.     SUBQ.W    #1,D0
  203. mtloop2    MOVE.B    (A1)+,D1
  204.     CMP.B    D2,D1
  205.     BGT.S    mtloop
  206.     DBRA    D0,mtloop2
  207.     ADDQ.B    #1,D2
  208.             
  209.     LEA    mt_SampleStarts(PC),A1
  210.     ASL.L    #8,D2
  211.     ASL.L    #2,D2
  212.     ADD.L    #1084,D2
  213.     ADD.L    A0,D2
  214.     MOVE.L    D2,A2
  215.     MOVEQ    #30,D0
  216. mtloop3    CLR.L    (A2)
  217.     MOVE.L    A2,(A1)+
  218.     MOVEQ    #0,D1
  219.     MOVE.W    42(A0),D1
  220.     ASL.L    #1,D1
  221.     ADD.L    D1,A2
  222.     ADD.L    #30,A0
  223.     DBRA    D0,mtloop3
  224.  
  225.     OR.B    #2,$BFE001
  226.     MOVE.B    #6,mt_speed
  227.     CLR.B    mt_counter
  228.     CLR.B    mt_SongPos
  229.     CLR.W    mt_PatternPos
  230. mt_end    SF    mt_Enable
  231.     LEA    $DFF000,A0
  232.     CLR.W    $A8(A0)
  233.     CLR.W    $B8(A0)
  234.     CLR.W    $C8(A0)
  235.     CLR.W    $D8(A0)
  236.     MOVE.W    #$F,$DFF096
  237.     RTS
  238.  
  239. mt_music
  240.     MOVEM.L    D0-D4/A0-A6,-(SP)
  241.     TST.B    mt_Enable
  242.     BEQ    mt_exit
  243.     ADDQ.B    #1,mt_counter
  244.     MOVE.B    mt_counter(PC),D0
  245.     CMP.B    mt_speed(PC),D0
  246.     BLO.S    mt_NoNewNote
  247.     CLR.B    mt_counter
  248.     TST.B    mt_PattDelTime2
  249.     BEQ.S    mt_GetNewNote
  250.     BSR.S    mt_NoNewAllChannels
  251.     BRA    mt_dskip
  252.  
  253. mt_NoNewNote
  254.     BSR.S    mt_NoNewAllChannels
  255.     BRA    mt_NoNewPosYet
  256.  
  257. mt_NoNewAllChannels
  258.     LEA    $DFF0A0,A5
  259.     LEA    mt_chan1temp(PC),A6
  260.     BSR    mt_CheckEfx
  261.     LEA    $DFF0B0,A5
  262.     LEA    mt_chan2temp(PC),A6
  263.     BSR    mt_CheckEfx
  264.     LEA    $DFF0C0,A5
  265.     LEA    mt_chan3temp(PC),A6
  266.     BSR    mt_CheckEfx
  267.     LEA    $DFF0D0,A5
  268.     LEA    mt_chan4temp(PC),A6
  269.     BRA    mt_CheckEfx
  270.  
  271. mt_GetNewNote
  272.     MOVE.L    mt_SongDataPtr(PC),A0
  273.     LEA    12(A0),A3
  274.     LEA    952(A0),A2    ;pattpo
  275.     LEA    1084(A0),A0    ;patterndata
  276.     MOVEQ    #0,D0
  277.     MOVEQ    #0,D1
  278.     MOVE.B    mt_SongPos(PC),D0
  279.     MOVE.B    (A2,D0.W),D1
  280.     ASL.L    #8,D1
  281.     ASL.L    #2,D1
  282.     ADD.W    mt_PatternPos(PC),D1
  283.     CLR.W    mt_DMACONtemp
  284.  
  285.     LEA    $DFF0A0,A5
  286.     LEA    mt_chan1temp(PC),A6
  287.     BSR.S    mt_PlayVoice
  288.     LEA    $DFF0B0,A5
  289.     LEA    mt_chan2temp(PC),A6
  290.     BSR.S    mt_PlayVoice
  291.     LEA    $DFF0C0,A5
  292.     LEA    mt_chan3temp(PC),A6
  293.     BSR.S    mt_PlayVoice
  294.     LEA    $DFF0D0,A5
  295.     LEA    mt_chan4temp(PC),A6
  296.     BSR.S    mt_PlayVoice
  297.     BRA    mt_SetDMA
  298.  
  299. mt_PlayVoice
  300.     TST.L    (A6)
  301.     BNE.S    mt_plvskip
  302.     BSR    mt_PerNop
  303. mt_plvskip
  304.     MOVE.L    (A0,D1.L),(A6)
  305.     ADDQ.L    #4,D1
  306.     MOVEQ    #0,D2
  307.     MOVE.B    n_cmd(A6),D2
  308.     AND.B    #$F0,D2
  309.     LSR.B    #4,D2
  310.     MOVE.B    (A6),D0
  311.     AND.B    #$F0,D0
  312.     OR.B    D0,D2
  313.     TST.B    D2
  314.     BEQ    mt_SetRegs
  315.     MOVEQ    #0,D3
  316.     LEA    mt_SampleStarts(PC),A1
  317.     MOVE    D2,D4
  318.     SUBQ.L    #1,D2
  319.     ASL.L    #2,D2
  320.     MULU    #30,D4
  321.     MOVE.L    (A1,D2.L),n_start(A6)
  322.     MOVE.W    (A3,D4.L),n_length(A6)
  323.     MOVE.W    (A3,D4.L),n_reallength(A6)
  324.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  325.     MOVE.B    3(A3,D4.L),n_volume(A6)
  326.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  327.     TST.W    D3
  328.     BEQ.S    mt_NoLoop
  329.     MOVE.L    n_start(A6),D2    ; Get start
  330.     ASL.W    #1,D3
  331.     ADD.L    D3,D2        ; Add repeat
  332.     MOVE.L    D2,n_loopstart(A6)
  333.     MOVE.L    D2,n_wavestart(A6)
  334.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  335.     ADD.W    6(A3,D4.L),D0    ; Add replen
  336.     MOVE.W    D0,n_length(A6)
  337.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  338.     MOVEQ    #0,D0
  339.     MOVE.B    n_volume(A6),D0
  340.     MOVE.W    D0,8(A5)    ; Set volume
  341.     BRA.S    mt_SetRegs
  342.  
  343. mt_NoLoop
  344.     MOVE.L    n_start(A6),D2
  345.     ADD.L    D3,D2
  346.     MOVE.L    D2,n_loopstart(A6)
  347.     MOVE.L    D2,n_wavestart(A6)
  348.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  349.     MOVEQ    #0,D0
  350.     MOVE.B    n_volume(A6),D0
  351.     MOVE.W    D0,8(A5)    ; Set volume
  352. mt_SetRegs
  353.     MOVE.W    (A6),D0
  354.     AND.W    #$0FFF,D0
  355.     BEQ    mt_CheckMoreEfx    ; If no note
  356.     MOVE.W    2(A6),D0
  357.     AND.W    #$0FF0,D0
  358.     CMP.W    #$0E50,D0
  359.     BEQ.S    mt_DoSetFineTune
  360.     MOVE.B    2(A6),D0
  361.     AND.B    #$0F,D0
  362.     CMP.B    #3,D0    ; TonePortamento
  363.     BEQ.S    mt_ChkTonePorta
  364.     CMP.B    #5,D0
  365.     BEQ.S    mt_ChkTonePorta
  366.     CMP.B    #9,D0    ; Sample Offset
  367.     BNE.S    mt_SetPeriod
  368.     BSR    mt_CheckMoreEfx
  369.     BRA.S    mt_SetPeriod
  370.  
  371. mt_DoSetFineTune
  372.     BSR    mt_SetFineTune
  373.     BRA.S    mt_SetPeriod
  374.  
  375. mt_ChkTonePorta
  376.     BSR    mt_SetTonePorta
  377.     BRA    mt_CheckMoreEfx
  378.  
  379. mt_SetPeriod
  380.     MOVEM.L    D0-D1/A0-A1,-(SP)
  381.     MOVE.W    (A6),D1
  382.     AND.W    #$0FFF,D1
  383.     LEA    mt_PeriodTable(PC),A1
  384.     MOVEQ    #0,D0
  385.     MOVEQ    #36,D2
  386. mt_ftuloop
  387.     CMP.W    (A1,D0.W),D1
  388.     BHS.S    mt_ftufound
  389.     ADDQ.L    #2,D0
  390.     DBRA    D2,mt_ftuloop
  391. mt_ftufound
  392.     MOVEQ    #0,D1
  393.     MOVE.B    n_finetune(A6),D1
  394.     MULU    #36*2,D1
  395.     ADD.L    D1,A1
  396.     MOVE.W    (A1,D0.W),n_period(A6)
  397.     MOVEM.L    (SP)+,D0-D1/A0-A1
  398.  
  399.     MOVE.W    2(A6),D0
  400.     AND.W    #$0FF0,D0
  401.     CMP.W    #$0ED0,D0 ; Notedelay
  402.     BEQ    mt_CheckMoreEfx
  403.  
  404.     MOVE.W    n_dmabit(A6),$DFF096
  405.     BTST    #2,n_wavecontrol(A6)
  406.     BNE.S    mt_vibnoc
  407.     CLR.B    n_vibratopos(A6)
  408. mt_vibnoc
  409.     BTST    #6,n_wavecontrol(A6)
  410.     BNE.S    mt_trenoc
  411.     CLR.B    n_tremolopos(A6)
  412. mt_trenoc
  413.     MOVE.L    n_start(A6),(A5)    ; Set start
  414.     MOVE.W    n_length(A6),4(A5)    ; Set length
  415.     MOVE.W    n_period(A6),D0
  416.     MOVE.W    D0,6(A5)        ; Set period
  417.     MOVE.W    n_dmabit(A6),D0
  418.     OR.W    D0,mt_DMACONtemp
  419.     BRA    mt_CheckMoreEfx
  420.  
  421. mt_SetDMA
  422.     MOVE.W    #300,D0
  423. mt_WaitDMA
  424.     DBRA    D0,mt_WaitDMA
  425.     MOVE.W    mt_DMACONtemp(PC),D0
  426.     OR.W    #$8000,D0
  427.     MOVE.W    D0,$DFF096
  428.     MOVE.W    #300,D0
  429. mt_WaitDMA2
  430.     DBRA    D0,mt_WaitDMA2
  431.  
  432.     LEA    $DFF000,A5
  433.     LEA    mt_chan4temp(PC),A6
  434.     MOVE.L    n_loopstart(A6),$D0(A5)
  435.     MOVE.W    n_replen(A6),$D4(A5)
  436.     LEA    mt_chan3temp(PC),A6
  437.     MOVE.L    n_loopstart(A6),$C0(A5)
  438.     MOVE.W    n_replen(A6),$C4(A5)
  439.     LEA    mt_chan2temp(PC),A6
  440.     MOVE.L    n_loopstart(A6),$B0(A5)
  441.     MOVE.W    n_replen(A6),$B4(A5)
  442.     LEA    mt_chan1temp(PC),A6
  443.     MOVE.L    n_loopstart(A6),$A0(A5)
  444.     MOVE.W    n_replen(A6),$A4(A5)
  445.  
  446. mt_dskip
  447.     ADD.W    #16,mt_PatternPos
  448.     MOVE.B    mt_PattDelTime,D0
  449.     BEQ.S    mt_dskc
  450.     MOVE.B    D0,mt_PattDelTime2
  451.     CLR.B    mt_PattDelTime
  452. mt_dskc    TST.B    mt_PattDelTime2
  453.     BEQ.S    mt_dska
  454.     SUBQ.B    #1,mt_PattDelTime2
  455.     BEQ.S    mt_dska
  456.     SUB.W    #16,mt_PatternPos
  457. mt_dska    TST.B    mt_PBreakFlag
  458.     BEQ.S    mt_nnpysk
  459.     SF    mt_PBreakFlag
  460.     MOVEQ    #0,D0
  461.     MOVE.B    mt_PBreakPos(PC),D0
  462.     CLR.B    mt_PBreakPos
  463.     LSL.W    #4,D0
  464.     MOVE.W    D0,mt_PatternPos
  465. mt_nnpysk
  466.     CMP.W    #1024,mt_PatternPos
  467.     BLO.S    mt_NoNewPosYet
  468. mt_NextPosition    
  469.     MOVEQ    #0,D0
  470.     MOVE.B    mt_PBreakPos(PC),D0
  471.     LSL.W    #4,D0
  472.     MOVE.W    D0,mt_PatternPos
  473.     CLR.B    mt_PBreakPos
  474.     CLR.B    mt_PosJumpFlag
  475.     ADDQ.B    #1,mt_SongPos
  476.     AND.B    #$7F,mt_SongPos
  477.     MOVE.B    mt_SongPos(PC),D1
  478.     MOVE.L    mt_SongDataPtr(PC),A0
  479.     CMP.B    950(A0),D1
  480.     BLO.S    mt_NoNewPosYet
  481.     CLR.B    mt_SongPos
  482.     move.w    #-1,songended
  483. mt_NoNewPosYet    
  484.     TST.B    mt_PosJumpFlag
  485.     BNE.S    mt_NextPosition
  486. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  487.     RTS
  488.  
  489. mt_CheckEfx
  490.     BSR    mt_UpdateFunk
  491.     MOVE.W    n_cmd(A6),D0
  492.     AND.W    #$0FFF,D0
  493.     BEQ.S    mt_PerNop
  494.     MOVE.B    n_cmd(A6),D0
  495.     AND.B    #$0F,D0
  496.     BEQ.S    mt_Arpeggio
  497.     CMP.B    #1,D0
  498.     BEQ    mt_PortaUp
  499.     CMP.B    #2,D0
  500.     BEQ    mt_PortaDown
  501.     CMP.B    #3,D0
  502.     BEQ    mt_TonePortamento
  503.     CMP.B    #4,D0
  504.     BEQ    mt_Vibrato
  505.     CMP.B    #5,D0
  506.     BEQ    mt_TonePlusVolSlide
  507.     CMP.B    #6,D0
  508.     BEQ    mt_VibratoPlusVolSlide
  509.     CMP.B    #$E,D0
  510.     BEQ    mt_E_Commands
  511. SetBack    MOVE.W    n_period(A6),6(A5)
  512.     CMP.B    #7,D0
  513.     BEQ    mt_Tremolo
  514.     CMP.B    #$A,D0
  515.     BEQ    mt_VolumeSlide
  516. mt_Return
  517.     RTS
  518.  
  519. mt_PerNop
  520.     MOVE.W    n_period(A6),6(A5)
  521.     RTS
  522.  
  523. mt_Arpeggio
  524.     MOVEQ    #0,D0
  525.     MOVE.B    mt_counter(PC),D0
  526.     DIVS    #3,D0
  527.     SWAP    D0
  528.     CMP.W    #0,D0
  529.     BEQ.S    mt_Arpeggio2
  530.     CMP.W    #2,D0
  531.     BEQ.S    mt_Arpeggio1
  532.     MOVEQ    #0,D0
  533.     MOVE.B    n_cmdlo(A6),D0
  534.     LSR.B    #4,D0
  535.     BRA.S    mt_Arpeggio3
  536.  
  537. mt_Arpeggio1
  538.     MOVEQ    #0,D0
  539.     MOVE.B    n_cmdlo(A6),D0
  540.     AND.B    #15,D0
  541.     BRA.S    mt_Arpeggio3
  542.  
  543. mt_Arpeggio2
  544.     MOVE.W    n_period(A6),D2
  545.     BRA.S    mt_Arpeggio4
  546.  
  547. mt_Arpeggio3
  548.     ASL.W    #1,D0
  549.     MOVEQ    #0,D1
  550.     MOVE.B    n_finetune(A6),D1
  551.     MULU    #36*2,D1
  552.     LEA    mt_PeriodTable(PC),A0
  553.     ADD.L    D1,A0
  554.     MOVEQ    #0,D1
  555.     MOVE.W    n_period(A6),D1
  556.     MOVEQ    #36,D3
  557. mt_arploop
  558.     MOVE.W    (A0,D0.W),D2
  559.     CMP.W    (A0),D1
  560.     BHS.S    mt_Arpeggio4
  561.     ADDQ.L    #2,A0
  562.     DBRA    D3,mt_arploop
  563.     RTS
  564.  
  565. mt_Arpeggio4
  566.     MOVE.W    D2,6(A5)
  567.     RTS
  568.  
  569. mt_FinePortaUp
  570.     TST.B    mt_counter
  571.     BNE.S    mt_Return
  572.     MOVE.B    #$0F,mt_LowMask
  573. mt_PortaUp
  574.     MOVEQ    #0,D0
  575.     MOVE.B    n_cmdlo(A6),D0
  576.     AND.B    mt_LowMask(PC),D0
  577.     MOVE.B    #$FF,mt_LowMask
  578.     SUB.W    D0,n_period(A6)
  579.     MOVE.W    n_period(A6),D0
  580.     AND.W    #$0FFF,D0
  581.     CMP.W    #113,D0
  582.     BPL.S    mt_PortaUskip
  583.     AND.W    #$F000,n_period(A6)
  584.     OR.W    #113,n_period(A6)
  585. mt_PortaUskip
  586.     MOVE.W    n_period(A6),D0
  587.     AND.W    #$0FFF,D0
  588.     MOVE.W    D0,6(A5)
  589.     RTS    
  590.  
  591. mt_FinePortaDown
  592.     TST.B    mt_counter
  593.     BNE    mt_Return
  594.     MOVE.B    #$0F,mt_LowMask
  595. mt_PortaDown
  596.     CLR.W    D0
  597.     MOVE.B    n_cmdlo(A6),D0
  598.     AND.B    mt_LowMask(PC),D0
  599.     MOVE.B    #$FF,mt_LowMask
  600.     ADD.W    D0,n_period(A6)
  601.     MOVE.W    n_period(A6),D0
  602.     AND.W    #$0FFF,D0
  603.     CMP.W    #856,D0
  604.     BMI.S    mt_PortaDskip
  605.     AND.W    #$F000,n_period(A6)
  606.     OR.W    #856,n_period(A6)
  607. mt_PortaDskip
  608.     MOVE.W    n_period(A6),D0
  609.     AND.W    #$0FFF,D0
  610.     MOVE.W    D0,6(A5)
  611.     RTS
  612.  
  613. mt_SetTonePorta
  614.     MOVE.L    A0,-(SP)
  615.     MOVE.W    (A6),D2
  616.     AND.W    #$0FFF,D2
  617.     MOVEQ    #0,D0
  618.     MOVE.B    n_finetune(A6),D0
  619.     MULU    #37*2,D0
  620.     LEA    mt_PeriodTable(PC),A0
  621.     ADD.L    D0,A0
  622.     MOVEQ    #0,D0
  623. mt_StpLoop
  624.     CMP.W    (A0,D0.W),D2
  625.     BHS.S    mt_StpFound
  626.     ADDQ.W    #2,D0
  627.     CMP.W    #37*2,D0
  628.     BLO.S    mt_StpLoop
  629.     MOVEQ    #35*2,D0
  630. mt_StpFound
  631.     MOVE.B    n_finetune(A6),D2
  632.     AND.B    #8,D2
  633.     BEQ.S    mt_StpGoss
  634.     TST.W    D0
  635.     BEQ.S    mt_StpGoss
  636.     SUBQ.W    #2,D0
  637. mt_StpGoss
  638.     MOVE.W    (A0,D0.W),D2
  639.     MOVE.L    (SP)+,A0
  640.     MOVE.W    D2,n_wantedperiod(A6)
  641.     MOVE.W    n_period(A6),D0
  642.     CLR.B    n_toneportdirec(A6)
  643.     CMP.W    D0,D2
  644.     BEQ.S    mt_ClearTonePorta
  645.     BGE    mt_Return
  646.     MOVE.B    #1,n_toneportdirec(A6)
  647.     RTS
  648.  
  649. mt_ClearTonePorta
  650.     CLR.W    n_wantedperiod(A6)
  651.     RTS
  652.  
  653. mt_TonePortamento
  654.     MOVE.B    n_cmdlo(A6),D0
  655.     BEQ.S    mt_TonePortNoChange
  656.     MOVE.B    D0,n_toneportspeed(A6)
  657.     CLR.B    n_cmdlo(A6)
  658. mt_TonePortNoChange
  659.     TST.W    n_wantedperiod(A6)
  660.     BEQ    mt_Return
  661.     MOVEQ    #0,D0
  662.     MOVE.B    n_toneportspeed(A6),D0
  663.     TST.B    n_toneportdirec(A6)
  664.     BNE.S    mt_TonePortaUp
  665. mt_TonePortaDown
  666.     ADD.W    D0,n_period(A6)
  667.     MOVE.W    n_wantedperiod(A6),D0
  668.     CMP.W    n_period(A6),D0
  669.     BGT.S    mt_TonePortaSetPer
  670.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  671.     CLR.W    n_wantedperiod(A6)
  672.     BRA.S    mt_TonePortaSetPer
  673.  
  674. mt_TonePortaUp
  675.     SUB.W    D0,n_period(A6)
  676.     MOVE.W    n_wantedperiod(A6),D0
  677.     CMP.W    n_period(A6),D0
  678.     BLT.S    mt_TonePortaSetPer
  679.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  680.     CLR.W    n_wantedperiod(A6)
  681.  
  682. mt_TonePortaSetPer
  683.     MOVE.W    n_period(A6),D2
  684.     MOVE.B    n_glissfunk(A6),D0
  685.     AND.B    #$0F,D0
  686.     BEQ.S    mt_GlissSkip
  687.     MOVEQ    #0,D0
  688.     MOVE.B    n_finetune(A6),D0
  689.     MULU    #36*2,D0
  690.     LEA    mt_PeriodTable(PC),A0
  691.     ADD.L    D0,A0
  692.     MOVEQ    #0,D0
  693. mt_GlissLoop
  694.     CMP.W    (A0,D0.W),D2
  695.     BHS.S    mt_GlissFound
  696.     ADDQ.W    #2,D0
  697.     CMP.W    #36*2,D0
  698.     BLO.S    mt_GlissLoop
  699.     MOVEQ    #35*2,D0
  700. mt_GlissFound
  701.     MOVE.W    (A0,D0.W),D2
  702. mt_GlissSkip
  703.     MOVE.W    D2,6(A5) ; Set period
  704.     RTS
  705.  
  706. mt_Vibrato
  707.     MOVE.B    n_cmdlo(A6),D0
  708.     BEQ.S    mt_Vibrato2
  709.     MOVE.B    n_vibratocmd(A6),D2
  710.     AND.B    #$0F,D0
  711.     BEQ.S    mt_vibskip
  712.     AND.B    #$F0,D2
  713.     OR.B    D0,D2
  714. mt_vibskip
  715.     MOVE.B    n_cmdlo(A6),D0
  716.     AND.B    #$F0,D0
  717.     BEQ.S    mt_vibskip2
  718.     AND.B    #$0F,D2
  719.     OR.B    D0,D2
  720. mt_vibskip2
  721.     MOVE.B    D2,n_vibratocmd(A6)
  722. mt_Vibrato2
  723.     MOVE.B    n_vibratopos(A6),D0
  724.     LEA    mt_VibratoTable(PC),A4
  725.     LSR.W    #2,D0
  726.     AND.W    #$001F,D0
  727.     MOVEQ    #0,D2
  728.     MOVE.B    n_wavecontrol(A6),D2
  729.     AND.B    #$03,D2
  730.     BEQ.S    mt_vib_sine
  731.     LSL.B    #3,D0
  732.     CMP.B    #1,D2
  733.     BEQ.S    mt_vib_rampdown
  734.     MOVE.B    #255,D2
  735.     BRA.S    mt_vib_set
  736. mt_vib_rampdown
  737.     TST.B    n_vibratopos(A6)
  738.     BPL.S    mt_vib_rampdown2
  739.     MOVE.B    #255,D2
  740.     SUB.B    D0,D2
  741.     BRA.S    mt_vib_set
  742. mt_vib_rampdown2
  743.     MOVE.B    D0,D2
  744.     BRA.S    mt_vib_set
  745. mt_vib_sine
  746.     MOVE.B    (A4,D0.W),D2
  747. mt_vib_set
  748.     MOVE.B    n_vibratocmd(A6),D0
  749.     AND.W    #15,D0
  750.     MULU    D0,D2
  751.     LSR.W    #7,D2
  752.     MOVE.W    n_period(A6),D0
  753.     TST.B    n_vibratopos(A6)
  754.     BMI.S    mt_VibratoNeg
  755.     ADD.W    D2,D0
  756.     BRA.S    mt_Vibrato3
  757. mt_VibratoNeg
  758.     SUB.W    D2,D0
  759. mt_Vibrato3
  760.     MOVE.W    D0,6(A5)
  761.     MOVE.B    n_vibratocmd(A6),D0
  762.     LSR.W    #2,D0
  763.     AND.W    #$003C,D0
  764.     ADD.B    D0,n_vibratopos(A6)
  765.     RTS
  766.  
  767. mt_TonePlusVolSlide
  768.     BSR    mt_TonePortNoChange
  769.     BRA    mt_VolumeSlide
  770.  
  771. mt_VibratoPlusVolSlide
  772.     BSR.S    mt_Vibrato2
  773.     BRA    mt_VolumeSlide
  774.  
  775. mt_Tremolo
  776.     MOVE.B    n_cmdlo(A6),D0
  777.     BEQ.S    mt_Tremolo2
  778.     MOVE.B    n_tremolocmd(A6),D2
  779.     AND.B    #$0F,D0
  780.     BEQ.S    mt_treskip
  781.     AND.B    #$F0,D2
  782.     OR.B    D0,D2
  783. mt_treskip
  784.     MOVE.B    n_cmdlo(A6),D0
  785.     AND.B    #$F0,D0
  786.     BEQ.S    mt_treskip2
  787.     AND.B    #$0F,D2
  788.     OR.B    D0,D2
  789. mt_treskip2
  790.     MOVE.B    D2,n_tremolocmd(A6)
  791. mt_Tremolo2
  792.     MOVE.B    n_tremolopos(A6),D0
  793.     LEA    mt_VibratoTable(PC),A4
  794.     LSR.W    #2,D0
  795.     AND.W    #$001F,D0
  796.     MOVEQ    #0,D2
  797.     MOVE.B    n_wavecontrol(A6),D2
  798.     LSR.B    #4,D2
  799.     AND.B    #$03,D2
  800.     BEQ.S    mt_tre_sine
  801.     LSL.B    #3,D0
  802.     CMP.B    #1,D2
  803.     BEQ.S    mt_tre_rampdown
  804.     MOVE.B    #255,D2
  805.     BRA.S    mt_tre_set
  806. mt_tre_rampdown
  807.     TST.B    n_vibratopos(A6)
  808.     BPL.S    mt_tre_rampdown2
  809.     MOVE.B    #255,D2
  810.     SUB.B    D0,D2
  811.     BRA.S    mt_tre_set
  812. mt_tre_rampdown2
  813.     MOVE.B    D0,D2
  814.     BRA.S    mt_tre_set
  815. mt_tre_sine
  816.     MOVE.B    (A4,D0.W),D2
  817. mt_tre_set
  818.     MOVE.B    n_tremolocmd(A6),D0
  819.     AND.W    #15,D0
  820.     MULU    D0,D2
  821.     LSR.W    #6,D2
  822.     MOVEQ    #0,D0
  823.     MOVE.B    n_volume(A6),D0
  824.     TST.B    n_tremolopos(A6)
  825.     BMI.S    mt_TremoloNeg
  826.     ADD.W    D2,D0
  827.     BRA.S    mt_Tremolo3
  828. mt_TremoloNeg
  829.     SUB.W    D2,D0
  830. mt_Tremolo3
  831.     BPL.S    mt_TremoloSkip
  832.     CLR.W    D0
  833. mt_TremoloSkip
  834.     CMP.W    #$40,D0
  835.     BLS.S    mt_TremoloOk
  836.     MOVE.W    #$40,D0
  837. mt_TremoloOk
  838.     MOVE.W    D0,8(A5)
  839.     MOVE.B    n_tremolocmd(A6),D0
  840.     LSR.W    #2,D0
  841.     AND.W    #$003C,D0
  842.     ADD.B    D0,n_tremolopos(A6)
  843.     RTS
  844.  
  845. mt_SampleOffset
  846.     MOVEQ    #0,D0
  847.     MOVE.B    n_cmdlo(A6),D0
  848.     BEQ.S    mt_sononew
  849.     MOVE.B    D0,n_sampleoffset(A6)
  850. mt_sononew
  851.     MOVE.B    n_sampleoffset(A6),D0
  852.     LSL.W    #7,D0
  853.     CMP.W    n_length(A6),D0
  854.     BGE.S    mt_sofskip
  855.     SUB.W    D0,n_length(A6)
  856.     LSL.W    #1,D0
  857.     ADD.L    D0,n_start(A6)
  858.     RTS
  859. mt_sofskip
  860.     MOVE.W    #$0001,n_length(A6)
  861.     RTS
  862.  
  863. mt_VolumeSlide
  864.     MOVEQ    #0,D0
  865.     MOVE.B    n_cmdlo(A6),D0
  866.     LSR.B    #4,D0
  867.     TST.B    D0
  868.     BEQ.S    mt_VolSlideDown
  869. mt_VolSlideUp
  870.     ADD.B    D0,n_volume(A6)
  871.     CMP.B    #$40,n_volume(A6)
  872.     BMI.S    mt_vsuskip
  873.     MOVE.B    #$40,n_volume(A6)
  874. mt_vsuskip
  875.     MOVE.B    n_volume(A6),D0
  876.     MOVE.W    D0,8(A5)
  877.     RTS
  878.  
  879. mt_VolSlideDown
  880.     MOVEQ    #0,D0
  881.     MOVE.B    n_cmdlo(A6),D0
  882.     AND.B    #$0F,D0
  883. mt_VolSlideDown2
  884.     SUB.B    D0,n_volume(A6)
  885.     BPL.S    mt_vsdskip
  886.     CLR.B    n_volume(A6)
  887. mt_vsdskip
  888.     MOVE.B    n_volume(A6),D0
  889.     MOVE.W    D0,8(A5)
  890.     RTS
  891.  
  892. mt_PositionJump
  893.     MOVE.B    n_cmdlo(A6),D0
  894.     SUBQ.B    #1,D0
  895.     MOVE.B    D0,mt_SongPos
  896. mt_pj2    CLR.B    mt_PBreakPos
  897.     ST     mt_PosJumpFlag
  898.     RTS
  899.  
  900. mt_VolumeChange
  901.     MOVEQ    #0,D0
  902.     MOVE.B    n_cmdlo(A6),D0
  903.     CMP.B    #$40,D0
  904.     BLS.S    mt_VolumeOk
  905.     MOVEQ    #$40,D0
  906. mt_VolumeOk
  907.     MOVE.B    D0,n_volume(A6)
  908.     MOVE.W    D0,8(A5)
  909.     RTS
  910.  
  911. mt_PatternBreak
  912.     MOVEQ    #0,D0
  913.     MOVE.B    n_cmdlo(A6),D0
  914.     MOVE.L    D0,D2
  915.     LSR.B    #4,D0
  916.     MULU    #10,D0
  917.     AND.B    #$0F,D2
  918.     ADD.B    D2,D0
  919.     CMP.B    #63,D0
  920.     BHI.S    mt_pj2
  921.     MOVE.B    D0,mt_PBreakPos
  922.     ST    mt_PosJumpFlag
  923.     RTS
  924.  
  925. mt_SetSpeed
  926.     MOVEQ    #0,D0
  927.     MOVE.B    3(A6),D0
  928.     BEQ    mt_end
  929.     CMP.B    #32,D0
  930.     BHS    SetTempo
  931.     CLR.B    mt_counter
  932.     MOVE.B    D0,mt_speed
  933.     RTS
  934.  
  935. SetTempo:
  936.     CMP.W    #32,D0
  937.     BHS.S    setemsk
  938.     MOVEQ    #32,D0
  939. setemsk    MOVE.W    D0,RealTempo
  940.     MOVE.L    TimerValue(PC),D2
  941.     DIVU    D0,D2
  942.     move.w    d2,ciatime
  943.     
  944.     RTS
  945.  
  946. mt_CheckMoreEfx
  947.     BSR    mt_UpdateFunk
  948.     MOVE.B    2(A6),D0
  949.     AND.B    #$0F,D0
  950.     CMP.B    #$9,D0
  951.     BEQ    mt_SampleOffset
  952.     CMP.B    #$B,D0
  953.     BEQ    mt_PositionJump
  954.     CMP.B    #$D,D0
  955.     BEQ    mt_PatternBreak
  956.     CMP.B    #$E,D0
  957.     BEQ.S    mt_E_Commands
  958.     CMP.B    #$F,D0
  959.     BEQ    mt_SetSpeed
  960.     CMP.B    #$C,D0
  961.     BEQ    mt_VolumeChange
  962.     BRA    mt_PerNop
  963.  
  964. mt_E_Commands
  965.     MOVE.B    n_cmdlo(A6),D0
  966.     AND.B    #$F0,D0
  967.     LSR.B    #4,D0
  968.     BEQ.S    mt_FilterOnOff
  969.     CMP.B    #1,D0
  970.     BEQ    mt_FinePortaUp
  971.     CMP.B    #2,D0
  972.     BEQ    mt_FinePortaDown
  973.     CMP.B    #3,D0
  974.     BEQ.S    mt_SetGlissControl
  975.     CMP.B    #4,D0
  976.     BEQ    mt_SetVibratoControl
  977.     CMP.B    #5,D0
  978.     BEQ    mt_SetFineTune
  979.     CMP.B    #6,D0
  980.     BEQ    mt_JumpLoop
  981.     CMP.B    #7,D0
  982.     BEQ    mt_SetTremoloControl
  983.     CMP.B    #9,D0
  984.     BEQ    mt_RetrigNote
  985.     CMP.B    #$A,D0
  986.     BEQ    mt_VolumeFineUp
  987.     CMP.B    #$B,D0
  988.     BEQ    mt_VolumeFineDown
  989.     CMP.B    #$C,D0
  990.     BEQ    mt_NoteCut
  991.     CMP.B    #$D,D0
  992.     BEQ    mt_NoteDelay
  993.     CMP.B    #$E,D0
  994.     BEQ    mt_PatternDelay
  995.     CMP.B    #$F,D0
  996.     BEQ    mt_FunkIt
  997.     RTS
  998.  
  999. mt_FilterOnOff
  1000.     MOVE.B    n_cmdlo(A6),D0
  1001.     AND.B    #1,D0
  1002.     ASL.B    #1,D0
  1003.     AND.B    #$FD,$BFE001
  1004.     OR.B    D0,$BFE001
  1005.     RTS    
  1006.  
  1007. mt_SetGlissControl
  1008.     MOVE.B    n_cmdlo(A6),D0
  1009.     AND.B    #$0F,D0
  1010.     AND.B    #$F0,n_glissfunk(A6)
  1011.     OR.B    D0,n_glissfunk(A6)
  1012.     RTS
  1013.  
  1014. mt_SetVibratoControl
  1015.     MOVE.B    n_cmdlo(A6),D0
  1016.     AND.B    #$0F,D0
  1017.     AND.B    #$F0,n_wavecontrol(A6)
  1018.     OR.B    D0,n_wavecontrol(A6)
  1019.     RTS
  1020.  
  1021. mt_SetFineTune
  1022.     MOVE.B    n_cmdlo(A6),D0
  1023.     AND.B    #$0F,D0
  1024.     MOVE.B    D0,n_finetune(A6)
  1025.     RTS
  1026.  
  1027. mt_JumpLoop
  1028.     TST.B    mt_counter
  1029.     BNE    mt_Return
  1030.     MOVE.B    n_cmdlo(A6),D0
  1031.     AND.B    #$0F,D0
  1032.     BEQ.S    mt_SetLoop
  1033.     TST.B    n_loopcount(A6)
  1034.     BEQ.S    mt_jumpcnt
  1035.     SUBQ.B    #1,n_loopcount(A6)
  1036.     BEQ    mt_Return
  1037. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1038.     ST    mt_PBreakFlag
  1039.     RTS
  1040.  
  1041. mt_jumpcnt
  1042.     MOVE.B    D0,n_loopcount(A6)
  1043.     BRA.S    mt_jmploop
  1044.  
  1045. mt_SetLoop
  1046.     MOVE.W    mt_PatternPos(PC),D0
  1047.     LSR.W    #4,D0
  1048.     MOVE.B    D0,n_pattpos(A6)
  1049.     RTS
  1050.  
  1051. mt_SetTremoloControl
  1052.     MOVE.B    n_cmdlo(A6),D0
  1053.     AND.B    #$0F,D0
  1054.     LSL.B    #4,D0
  1055.     AND.B    #$0F,n_wavecontrol(A6)
  1056.     OR.B    D0,n_wavecontrol(A6)
  1057.     RTS
  1058.  
  1059. mt_RetrigNote
  1060.     MOVE.L    D1,-(SP)
  1061.     MOVEQ    #0,D0
  1062.     MOVE.B    n_cmdlo(A6),D0
  1063.     AND.B    #$0F,D0
  1064.     BEQ.S    mt_rtnend
  1065.     MOVEQ    #0,D1
  1066.     MOVE.B    mt_counter(PC),D1
  1067.     BNE.S    mt_rtnskp
  1068.     MOVE.W    (A6),D1
  1069.     AND.W    #$0FFF,D1
  1070.     BNE.S    mt_rtnend
  1071.     MOVEQ    #0,D1
  1072.     MOVE.B    mt_counter(PC),D1
  1073. mt_rtnskp
  1074.     DIVU    D0,D1
  1075.     SWAP    D1
  1076.     TST.W    D1
  1077.     BNE.S    mt_rtnend
  1078. mt_DoRetrig
  1079.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1080.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1081.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1082.     MOVE.W    #300,D0
  1083. mt_rtnloop1
  1084.     DBRA    D0,mt_rtnloop1
  1085.     MOVE.W    n_dmabit(A6),D0
  1086.     BSET    #15,D0
  1087.     MOVE.W    D0,$DFF096
  1088.     MOVE.W    #300,D0
  1089. mt_rtnloop2
  1090.     DBRA    D0,mt_rtnloop2
  1091.     MOVE.L    n_loopstart(A6),(A5)
  1092.     MOVE.L    n_replen(A6),4(A5)
  1093. mt_rtnend
  1094.     MOVE.L    (SP)+,D1
  1095.     RTS
  1096.  
  1097. mt_VolumeFineUp
  1098.     TST.B    mt_counter
  1099.     BNE    mt_Return
  1100.     MOVEQ    #0,D0
  1101.     MOVE.B    n_cmdlo(A6),D0
  1102.     AND.B    #$F,D0
  1103.     BRA    mt_VolSlideUp
  1104.  
  1105. mt_VolumeFineDown
  1106.     TST.B    mt_counter
  1107.     BNE    mt_Return
  1108.     MOVEQ    #0,D0
  1109.     MOVE.B    n_cmdlo(A6),D0
  1110.     AND.B    #$0F,D0
  1111.     BRA    mt_VolSlideDown2
  1112.  
  1113. mt_NoteCut
  1114.     MOVEQ    #0,D0
  1115.     MOVE.B    n_cmdlo(A6),D0
  1116.     AND.B    #$0F,D0
  1117.     CMP.B    mt_counter(PC),D0
  1118.     BNE    mt_Return
  1119.     CLR.B    n_volume(A6)
  1120.     MOVE.W    #0,8(A5)
  1121.     RTS
  1122.  
  1123. mt_NoteDelay
  1124.     MOVEQ    #0,D0
  1125.     MOVE.B    n_cmdlo(A6),D0
  1126.     AND.B    #$0F,D0
  1127.     CMP.B    mt_Counter,D0
  1128.     BNE    mt_Return
  1129.     MOVE.W    (A6),D0
  1130.     BEQ    mt_Return
  1131.     MOVE.L    D1,-(SP)
  1132.     BRA    mt_DoRetrig
  1133.  
  1134. mt_PatternDelay
  1135.     TST.B    mt_counter
  1136.     BNE    mt_Return
  1137.     MOVEQ    #0,D0
  1138.     MOVE.B    n_cmdlo(A6),D0
  1139.     AND.B    #$0F,D0
  1140.     TST.B    mt_PattDelTime2
  1141.     BNE    mt_Return
  1142.     ADDQ.B    #1,D0
  1143.     MOVE.B    D0,mt_PattDelTime
  1144.     RTS
  1145.  
  1146. mt_FunkIt
  1147.     TST.B    mt_counter
  1148.     BNE    mt_Return
  1149.     MOVE.B    n_cmdlo(A6),D0
  1150.     AND.B    #$0F,D0
  1151.     LSL.B    #4,D0
  1152.     AND.B    #$0F,n_glissfunk(A6)
  1153.     OR.B    D0,n_glissfunk(A6)
  1154.     TST.B    D0
  1155.     BEQ    mt_Return
  1156. mt_UpdateFunk
  1157.     MOVEM.L    A0/D1,-(SP)
  1158.     MOVEQ    #0,D0
  1159.     MOVE.B    n_glissfunk(A6),D0
  1160.     LSR.B    #4,D0
  1161.     BEQ.S    mt_funkend
  1162.     LEA    mt_FunkTable(PC),A0
  1163.     MOVE.B    (A0,D0.W),D0
  1164.     ADD.B    D0,n_funkoffset(A6)
  1165.     BTST    #7,n_funkoffset(A6)
  1166.     BEQ.S    mt_funkend
  1167.     CLR.B    n_funkoffset(A6)
  1168.  
  1169.     MOVE.L    n_loopstart(A6),D0
  1170.     MOVEQ    #0,D1
  1171.     MOVE.W    n_replen(A6),D1
  1172.     ADD.L    D1,D0
  1173.     ADD.L    D1,D0
  1174.     MOVE.L    n_wavestart(A6),A0
  1175.     ADDQ.L    #1,A0
  1176.     CMP.L    D0,A0
  1177.     BLO.S    mt_funkok
  1178.     MOVE.L    n_loopstart(A6),A0
  1179. mt_funkok
  1180.     MOVE.L    A0,n_wavestart(A6)
  1181.     MOVEQ    #-1,D0
  1182.     SUB.B    (A0),D0
  1183.     MOVE.B    D0,(A0)
  1184. mt_funkend
  1185.     MOVEM.L    (SP)+,A0/D1
  1186.     RTS
  1187.  
  1188.  
  1189. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1190.  
  1191. mt_VibratoTable    
  1192.     dc.b   0, 24, 49, 74, 97,120,141,161
  1193.     dc.b 180,197,212,224,235,244,250,253
  1194.     dc.b 255,253,250,244,235,224,212,197
  1195.     dc.b 180,161,141,120, 97, 74, 49, 24
  1196.  
  1197. mt_PeriodTable
  1198. ; Tuning 0, Normal
  1199.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1200.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1201.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1202. ; Tuning 1
  1203.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1204.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1205.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1206. ; Tuning 2
  1207.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1208.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1209.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1210. ; Tuning 3
  1211.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1212.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1213.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1214. ; Tuning 4
  1215.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1216.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1217.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1218. ; Tuning 5
  1219.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1220.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1221.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1222. ; Tuning 6
  1223.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1224.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1225.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1226. ; Tuning 7
  1227.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1228.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1229.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1230. ; Tuning -8
  1231.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1232.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1233.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1234. ; Tuning -7
  1235.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1236.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1237.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1238. ; Tuning -6
  1239.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1240.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1241.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1242. ; Tuning -5
  1243.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1244.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1245.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1246. ; Tuning -4
  1247.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1248.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1249.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1250. ; Tuning -3
  1251.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1252.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1253.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1254. ; Tuning -2
  1255.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1256.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1257.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1258. ; Tuning -1
  1259.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1260.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1261.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1262.  
  1263. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1264. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1265. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1266. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1267.  
  1268. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1269.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1270.  
  1271. mt_SongDataPtr    dc.l 0
  1272. mt_speed    dc.b 6
  1273. mt_counter    dc.b 0
  1274. mt_SongPos    dc.b 0
  1275. mt_PBreakPos    dc.b 0
  1276. mt_PosJumpFlag    dc.b 0
  1277. mt_PBreakFlag    dc.b 0
  1278. mt_LowMask    dc.b 0
  1279. mt_PattDelTime    dc.b 0
  1280. mt_PattDelTime2    dc.b 0
  1281. mt_Enable    dc.b 0
  1282. mt_PatternPos    dc.w 0
  1283. mt_DMACONtemp    dc.w 0
  1284. ciatime2:    dc.l    0
  1285.  
  1286. ;/* End of File */
  1287.  
  1288.  
  1289.  
  1290.     ********************************************************
  1291.  
  1292.  
  1293. ***------------------------------------------------------------------------
  1294. *** This is the ultimate Data-Decrunch-Routine
  1295. *** for Crunch-Mania V1.4
  1296. *** (c) 1991 by FRESH THRASH of CERBERUS, all rights reserved
  1297. *** You may use this piece of code as long as you don't claim that
  1298. *** you have written it. In any case the author (me) has to be
  1299. *** mentioned someplace in your proggy.
  1300. *** Note: Source- and Destinationaddresses have to be always even Addresses
  1301. ***------------------------------------------------------------------------
  1302. *** Here is the Format of the Header:
  1303. *** Type  Offset  Contents                   Function
  1304. *** LONG  0       "CrM!"                     to recongnize crunched files
  1305. *** WORD  4       Minimum Security Distance  to savely decrunch data when
  1306. ***                    Source and Dest is in the same
  1307. ***                    Memoryblock
  1308. *** LONG  6       Original Len               Datalen before packing
  1309. *** LONG  10 ($a) Crunched Len               Datalen after packing without
  1310. ***                    Header
  1311. **-----------------------------------------------------------
  1312. ** Jump here to decrunch some data without any overlap checks
  1313. ** The Regs have to loaded with:
  1314. ** a0: Adr of Source (with Header)
  1315. ** a1: Adr of Dest
  1316. **-----------------------------------------------------------
  1317. NormalDecrunch:
  1318.     movem.l    d0-d7/a0-a6,-(sp)
  1319.     cmp.l    #"CrM!",(a0)+
  1320.     bne.s    .NotCrunched
  1321.     tst.w    (a0)+            ;skip MinSecDist
  1322.     move.l    (a0)+,d1            ;OrgLen
  1323.     move.l    (a0)+,d2            ;CrLen
  1324.     move.l    a0,a2
  1325.     bsr.s    FastDecruncher
  1326. .NotCrunched:
  1327.     movem.l    (sp)+,d0-d7/a0-a6
  1328.     rts
  1329. **-------------------------------------------------------------------
  1330. ** This is the pure Decrunch-Routine
  1331. ** The Registers have to be loaded with the following values:
  1332. ** a1: Adr of Destination (normal)    ** a2: Adr of Source (packed)
  1333. ** d1: Len of Destination        ** d2: Len of Source
  1334. **-------------------------------------------------------------------
  1335. FastDecruncher:
  1336.     move.l    a1,a5            ;Decrunched Anfang (hier Ende des Decrunchens)
  1337.     add.l    d1,a1
  1338.     add.l    d2,a2
  1339.     move.w    -(a2),d0            ;Anz Bits in letztem Wort
  1340.     move.l    -(a2),d6            ;1.LW
  1341.     moveq    #16,d7            ;Anz Bits
  1342.     sub.w    d0,d7            ;Anz Bits, die rotiert werden müssen
  1343.     lsr.l    d7,d6            ;1.Bits an Anfang bringen
  1344.     move.w    d0,d7            ;Anz Bits, die noch im Wort sind
  1345.     moveq    #16,d3
  1346.     moveq    #0,d4
  1347. .DecrLoop:
  1348.     move.w    d1,$dff180
  1349.  
  1350.     cmp.l    a5,a1
  1351.     ble.L    .DecrEnd            ;a1=a5: fertig (a1<a5: eigentlich Fehler)
  1352.  
  1353.     bsr.s    .BitTest
  1354.     bcc.s    .InsertSeq        ;1.Bit 0: Sequenz
  1355.     moveq    #0,d4
  1356. ** einzelne Bytes einfügen **
  1357. .InsertBytes:
  1358.     moveq    #8,d1
  1359.     bsr.w    .GetBits
  1360.     move.b    d0,-(a1)
  1361.     dbf    d4,.InsertBytes
  1362.     bra.s    .DecrLoop
  1363. *------------
  1364. .SpecialInsert:
  1365.     moveq    #14,d4
  1366.     moveq    #5,d1
  1367.     bsr.s    .BitTest
  1368.     bcs.s    .IB1
  1369.     moveq    #14,d1
  1370. .IB1:    bsr.s    .GetBits
  1371.     add.w    d0,d4
  1372.     bra.s    .InsertBytes
  1373. *------------
  1374. .InsertSeq:
  1375. ** Anzahl der gleichen Bits holen **
  1376.     bsr.s    .BitTest
  1377.     bcs.s    .AB1
  1378.     moveq    #1,d1            ;Maske: 0 (1 AB)
  1379.     moveq    #1,d4            ;normal: Summe 1
  1380.     bra.s    .ABGet
  1381. .AB1:
  1382.     bsr.s    .BitTest
  1383.     bcs.s    .AB2
  1384.     moveq    #2,d1            ;Maske: 01 (2 ABs)
  1385.     moveq    #3,d4            ;ab hier: Summe mindestens 3
  1386.     bra.s    .ABGet
  1387. .AB2:
  1388.     bsr.s    .BitTest
  1389.     bcs.s    .AB3
  1390.     moveq    #4,d1            ;Maske: 011 (4 ABs)
  1391.     moveq    #7,d4            ;hier: Summe 11
  1392.     bra.s    .ABGet
  1393. .AB3:
  1394.     moveq    #8,d1            ;Maske: 111 (8 ABs)
  1395.     moveq    #$17,d4            ;hier: Summe 11
  1396. .ABGet:
  1397.     bsr.s    .GetBits
  1398.     add.w    d0,d4            ;d0: Länge der Sequenz - 1
  1399.     cmp.w    #22,d4
  1400.     beq.s    .SpecialInsert
  1401.     blt.s    .Cont
  1402.     subq.w    #1,d4
  1403. .Cont:
  1404. ** SequenzAnbstand holen **
  1405.     bsr.s    .BitTest
  1406.     bcs.s    .DB1
  1407.     moveq    #9,d1            ;Maske: 0 (9 DBs)
  1408.     moveq    #$20,d2
  1409.     bra.s    .DBGet
  1410. .DB1:
  1411.     bsr.s    .BitTest
  1412.     bcs.s    .DB2
  1413.     moveq    #5,d1            ;Maske: 01 (5 DBs)
  1414.     moveq    #0,d2
  1415.     bra.s    .DBGet
  1416. .DB2:
  1417.     moveq    #14,d1            ;Maske: 11 (12 DBs)
  1418.     move.w    #$220,d2
  1419. .DBGet:
  1420.     bsr.s    .GetBits
  1421.     add.w    d2,d0
  1422.     lea    0(a1,d0.w),a3        ;a3 auf Anf zu kopierender Seq setzten
  1423. .InsSeqLoop:
  1424.     move.b    -(a3),-(a1)        ;Byte kopieren
  1425.     dbf    d4,.InsSeqLoop
  1426.  
  1427.     bra.w    .DecrLoop
  1428. *------------
  1429. .BitTest:
  1430.     subq.w    #1,d7
  1431.     bne.s    .BTNoLoop
  1432.     moveq    #16,d7            ;hier kein add notwendig: d7 vorher 0
  1433.     move.w    d6,d0
  1434.     lsr.l    #1,d6            ;Bit rausschieben und Flags setzen
  1435.     swap    d6            ;ror.l    #16,d6
  1436.     move.w    -(a2),d6        ;nächstes Wort holen
  1437.     swap    d6            ;rol.l    #16,d6
  1438.     lsr.w    #1,d0            ;Bit rausschieben und Flags setzen
  1439.     rts
  1440. .BTNoLoop:
  1441.     lsr.l    #1,d6            ;Bit rausschieben und Flags setzen
  1442.     rts
  1443. *----------
  1444. .GetBits:                ;d1:AnzBits->d0:Bits
  1445.     move.w    d6,d0            ;d6:Akt Wort
  1446.     lsr.l    d1,d6            ;nächste Bits nach vorne bringen
  1447.     sub.w    d1,d7            ;d7:Anz Bits, die noch im Wort sind
  1448.     bgt.s    .GBNoLoop
  1449. ;    add.w    #16,d7            ;BitCounter korrigieren
  1450.     add.w    d3,d7            ;BitCounter korrigieren
  1451.     ror.l    d7,d6            ;restliche Bits re rausschieben
  1452.     move.w    -(a2),d6        ;nächstes Wort holen
  1453.     rol.l    d7,d6            ;und zurückrotieren
  1454. .GBNoLoop:
  1455.     add.w    d1,d1            ;*2 (in Tab sind Ws)
  1456.     and.w    .AndData-2(pc,d1.w),d0    ;unerwünschte Bits rausschmeißen
  1457.     rts
  1458. *----------
  1459. .AndData:
  1460.     dc.w    %1,%11,%111,%1111,%11111,%111111,%1111111
  1461.     dc.w    %11111111,%111111111,%1111111111
  1462.     dc.w    %11111111111,%111111111111
  1463.     dc.w    %1111111111111,%11111111111111
  1464. *-----------
  1465. .DecrEnd:
  1466.     rts        ;a5: Start of decrunched Data
  1467.  
  1468.  
  1469.     ********************************************************
  1470.  
  1471. search_for_disk:
  1472.     move.l    d0,looklabel
  1473.  
  1474. sfd_loop:
  1475.     move.b    #0,drive
  1476.     move.l    #1,d7        ; check drive for ready
  1477.     trap    #load
  1478.     cmp.l    looklabel,d0
  1479.     beq    found_disk
  1480.  
  1481.     move.b    #1,drive
  1482.     move.l    #1,d7        ; check drive for ready
  1483.     trap    #load
  1484.     cmp.l    looklabel,d0
  1485.     beq    found_disk
  1486.  
  1487.     move.b    #2,drive
  1488.     move.l    #1,d7        ; check drive for ready
  1489.     trap    #load
  1490.     cmp.l    looklabel,d0
  1491.     beq    found_disk
  1492.  
  1493.     move.b    #3,drive
  1494.     move.l    #1,d7        ; check drive for ready
  1495.     trap    #load
  1496.     cmp.l    looklabel,d0
  1497.     beq    found_disk
  1498.  
  1499.     ;bsr    show_insert_pic
  1500.     
  1501.     bra    sfd_loop    
  1502.  
  1503.  
  1504. found_disk:
  1505.     clr.l    d0
  1506.     rts
  1507.  
  1508.     
  1509. get_volume_name:
  1510.     move.l    #0,label
  1511.     lea    $bfd000,a5
  1512.     move.b    #$ff,$100(a5)    ; deselect all drives
  1513.     bsr    mini_pause
  1514.     bclr    #7,$100(a5)    ; motor on
  1515.     bsr    mini_pause
  1516.     move.b    drive,d6
  1517.     add.b    #3,d6
  1518.     bclr    d6,$100(a5)    ; select drive
  1519.     bsr    mini_pause
  1520.     
  1521.     move.w    #600/headspeed,d7
  1522. .volloop
  1523.     bsr    mspause
  1524.     btst    #5,$1001(a5)    ; drive ready 
  1525.     beq    .is_ready
  1526.     dbf    d7,.volloop
  1527. .not_ready
  1528.     move.b    #$ff,$100(a5)    ; deselect all drives
  1529.     bsr    mini_pause
  1530.  
  1531.     move.b    #$ff,d0
  1532.     move.b    drive,d6
  1533.     add.b    #3,d6
  1534.     bchg    d6,d0
  1535.     move.b    d0,$100(a5)    ; select drive
  1536.     bsr    mini_pause
  1537.  
  1538.     move.b    #$ff,$100(a5)    ; deselect all drives
  1539.     bsr    mini_pause
  1540.     
  1541.     move.l    #-1,d0
  1542.     rte
  1543.  
  1544. .is_ready
  1545.     move.l    volumespace,a0    ; load address
  1546.     move.l    #$000000,d0    ; disk address (as trackdisk.device)
  1547.     move.l    #$400,d1        ; length
  1548.     move.l    #0,d7        ; mfm load
  1549.     trap    #load
  1550.     move.l    14(a0),label
  1551.     move.l    14(a0),d0
  1552.     rte
  1553.  
  1554. loadtracks:
  1555.     cmp.l    #1,d7
  1556.     beq    get_volume_name
  1557.  
  1558.     movem.l    d0-d7/a1-a6,-(sp)
  1559.  
  1560.     move.l    a0,loadaddress
  1561.     move.l    d0,diskaddress
  1562.     move.l    d1,loadlength
  1563.     
  1564.     lsr.l    #7,d1
  1565.     lsr.l    #2,d1        ; div by 512
  1566.  
  1567.     divu    #11,d1        ; number of tracks
  1568.     and.l    #$ffff,d1
  1569.     add.w    #1,d1
  1570.     cmp.l    #$2c00,loadlength
  1571.     blt    .short_load
  1572.     add.w    #1,d1
  1573. .short_load
  1574.     
  1575.     lsr.l    #7,d0        
  1576.     lsr.l    #2,d0        ; div by 512    
  1577.     divu    #11,d0
  1578.     and.l    #$ffff,d0
  1579.  
  1580.     move.w    d0,temp
  1581.     
  1582.                 ; d0=track
  1583.                 ; d1=number of tracks
  1584.         
  1585.  
  1586.     lea    workspace,a4    ; workspace
  1587.     lea    $bfd000,a5    ; base address of cia
  1588.     lea    $dff000,a6    ; base address of hardware
  1589.     move.l    #$55555555,d7    ; data mask - for mfm decoding
  1590.  
  1591.     move.b    $1f01(a5),d6
  1592.     and.b    #%11000000,d6
  1593.     or.b    #%00001000,d6
  1594.     move.b    d6,$1f01(a5)
  1595.     move.b    #%00000010,$1d01(a5)
  1596.     move.b    #(time&$ff),$1601(a5)
  1597.     move.b    #(time>>8),$1701(a5)
  1598.  
  1599.     move.w    #$98d0,d5    ; disk length
  1600.     move.w    #$4489,a1    ; disk sync
  1601.     bsr    load2
  1602.     
  1603.     clr.l    d2
  1604.     move.w    temp,d2        ; track number
  1605.     move.l    loadaddress,a0
  1606.     move.l    diskaddress,d0
  1607.     move.l    loadlength,d1
  1608.     
  1609.     mulu    #11,d2
  1610.     asl.l    #7,d2
  1611.     asl.l    #2,d2
  1612.     
  1613.     sub.l    d2,d0
  1614.     add.l    d0,a0        ; a0 = data start address
  1615.  
  1616.     movem.l    (sp)+,d0-d7/a1-a6    
  1617.     rte
  1618.  
  1619. load2:    subq.w    #1,d1
  1620.     bmi    mini_pause
  1621.     bsr    find_track
  1622.  
  1623. read_tracks
  1624.     bsr.w    readdata
  1625.  
  1626.     move.l    a4,a2
  1627.     moveq    #10,d6
  1628.  
  1629. find_sync
  1630.     cmp.w    (a2)+,a1
  1631.     bne.b    find_sync
  1632.  
  1633.     cmp.w    (a2),a1
  1634.     bne.b    double_sync
  1635.  
  1636.     add.l    #2,a2
  1637.  
  1638. double_sync
  1639.     move.l    (a2),d3
  1640.     move.l    4(a2),d4
  1641.     and.w    d7,d3
  1642.     and.w    d7,d4
  1643.     lsl.w    #1,d3
  1644.     or.w    d4,d3
  1645.     asr.w    #8,d3
  1646.     move.l    a0,a3
  1647.     lsl.w    #8,d3
  1648.     lsl.w    #1,d3
  1649.     add.w    d3,a3
  1650.     lea    $38(a2),a2
  1651.  
  1652.     moveq    #127,d2
  1653.  
  1654. decode_mfm    
  1655.     move.l    $200(a2),d3
  1656.     move.l    (a2)+,d4
  1657.     and.l    d7,d3
  1658.     and.l    d7,d4
  1659.     lsl.l    #1,d4
  1660.     or.l    d3,d4
  1661.     move.l    d4,(a3)+
  1662.     dbf    d2,decode_mfm
  1663.     dbf    d6,find_sync
  1664.  
  1665.     lea    $1600(a0),a0
  1666.     add.b    #1,d0
  1667.     bsr    mspause
  1668.     bsr.b    flip_side
  1669.     bsr    mspause
  1670.     dbf    d1,read_tracks
  1671.  
  1672. finished_blocks:
  1673.  
  1674.     move.b    #$ff,$100(a5)    ; deselect all drives
  1675.     bsr.b    mini_pause    
  1676.  
  1677.     move.b    #$ff,d0
  1678.     move.b    drive,d6
  1679.     add.b    #3,d6
  1680.     bchg    d6,d0
  1681.     move.b    d0,$100(a5)    ; select drive
  1682.     bsr    mini_pause
  1683.     
  1684.     move.b    #$ff,$100(a5)    ; deselect all drives
  1685. mini_pause:
  1686.     rts    
  1687.  
  1688. find_track
  1689.     move.b    #$ff,$100(a5)    ; deselect all drives
  1690.     bsr.b    mini_pause
  1691.     
  1692.     bclr    #7,$100(a5)    ; motor on
  1693.     bsr.b    mini_pause    
  1694.     
  1695.     move.b    drive,d6
  1696.     add.b    #3,d6
  1697.     bclr    d6,$100(a5)    ; select drive 0
  1698.     bsr.b    mini_pause
  1699.     bsr.b    drive_ready
  1700.  
  1701.     bset    #1,$100(a5)    ; direction towards outside
  1702.  
  1703.     ; look for track 0
  1704.  
  1705. track_0:
  1706.     btst    #4,$1001(a5)    ; check for track 0    
  1707.     beq.b    side0
  1708.     bsr.b    step_heads
  1709.     bra.b    track_0
  1710.  
  1711. flip_side:
  1712.     bchg    #2,$100(a5)    ; change side 
  1713.     btst    #0,d0
  1714.     bne.b    mini_pause
  1715.  
  1716. centre:    bclr    #1,$100(a5)    ; direction towards centre
  1717.  
  1718. step_heads:
  1719.     bclr    #0,$100(a5)    ; pulse step low
  1720.     bsr.b    mini_pause
  1721.     bset    #0,$100(a5)    ; pulse step high    
  1722.     bsr    mspause        ; milisecond pause
  1723.     rts
  1724.  
  1725. side0:    bset    #2,$100(a5)    ; side 0
  1726.     move.w    d0,d2
  1727.     lsr.b    #1,d2
  1728.     bcc.b    side1
  1729.  
  1730.     bclr    #2,$100(a5)    ; side 1
  1731.  
  1732. side1:    subq.b    #1,d2
  1733.     bmi    mini_pause
  1734.     
  1735. find_centre:
  1736.     bsr.b    centre
  1737.     dbf    d2,find_centre
  1738.     rts
  1739.  
  1740. drive_ready:
  1741.     btst    #5,$1001(a5)    ; drive ready 
  1742.     bne.b    drive_ready
  1743.     rts
  1744.  
  1745.  
  1746. readdata:
  1747.     move.w    #$8500,$9e(a6)    ; set bits 8,10 = disk data clock rate 1=fast 
  1748.                 ; word sync to sync ($4489)    
  1749.     move.w    a1,$7e(a6)    ; set sync to $4489
  1750.     bsr    drive_ready
  1751.  
  1752.     move.w    #$4000,$24(a6)    ; disk length (write disk to ram)
  1753.     move.l    a4,$20(a6)    ; disk pointer
  1754.     move.w    d5,$24(a6)    ; disk length($18d0 + set)
  1755.     move.w    d5,$24(a6)    ; disk length again - must be twice(!!)
  1756.  
  1757.     move.w    #2,$9c(a6)    ; int req - clear disk blk finished
  1758.  
  1759. waitblk:    move.w    $1e(a6),d2    ; irq bits read - 
  1760.     btst    #1,d2        ; disk blk finished
  1761.     beq    waitblk
  1762.     
  1763.     rts
  1764.  
  1765. mspause:
  1766.     lea    $bfd000,a5    ; base address of cia
  1767.  
  1768.     move.b    $1f01(a5),d6
  1769.     and.b    #%11000000,d6
  1770.     or.b    #%00001000,d6
  1771.     move.b    d6,$1f01(a5)
  1772.     move.b    #%00000010,$1d01(a5)
  1773.     move.b    #(time&$ff),$1601(a5)
  1774.     move.b    #(time>>8),$1701(a5)
  1775.  
  1776. busy_wait:
  1777.     btst.b    #1,$1d01(a5)
  1778.     beq    busy_wait
  1779.  
  1780.     rts
  1781.  
  1782.     ********************************************************
  1783.  
  1784. loadmodule:    
  1785.     move.l    diskptr,a6
  1786.  
  1787.     move.l    00(a6),d0
  1788.     bsr    search_for_disk
  1789.  
  1790. .reloadfile
  1791.     move.l    my_mem,a0    ; load address
  1792.     move.l    04(a6),d0    ; disk address
  1793.     move.l    08(a6),d1    ; length
  1794.     move.l    #0,d7        ; mfm load
  1795.     trap    #load
  1796.  
  1797.     movem.l    d1-d7/a0-a6,-(a7)
  1798.     
  1799.     move.l    08(a6),d1
  1800.     lsr.l    #2,d1
  1801.     sub.l    #1,d1
  1802.     move.l    #0,d0
  1803. .loop    move.l    (a0)+,d2
  1804.     eor.l    d2,d0
  1805.     sub.l    #1,d1
  1806.     bpl.s    .loop
  1807.  
  1808.     movem.l    (a7)+,d1-d7/a0-a6
  1809.  
  1810.     cmp.l    16(a6),d0    ; checksum
  1811.     bne    .reloadfile
  1812.     
  1813.  
  1814.     move.l    mt_data1,a1
  1815.     bsr    NormalDecrunch
  1816.  
  1817.     rts
  1818.  
  1819.     ********************************************************
  1820.  
  1821. show_iff:
  1822.     move.w    #$0200,iff_res+2
  1823.     
  1824.     move.l    iff,a0
  1825.     cmp.l    #"FORM",(a0)
  1826.     bne    not_iff
  1827.  
  1828.     move.l    iff,a0
  1829.     move.l    #"BMHD",d0
  1830.     bsr    findhunk
  1831.     cmp.l    #-1,a0
  1832.     beq    not_iff
  1833.     
  1834.     move.w    08(a0),iff_width
  1835.     move.w    10(a0),iff_height
  1836.     move.b    16(a0),iff_depth
  1837.     move.b    18(a0),iff_compression
  1838.  
  1839.     move.w    iff_width,d0
  1840.     lsr.w    #3,d0
  1841.     move.w    iff_height,d1
  1842.     mulu    d0,d1
  1843.     move.l    d1,iff_bmpsize
  1844.     move.b    iff_depth,d0
  1845.     mulu    d0,d1
  1846.     move.l    iff_maxsize,d0
  1847.     cmp.l    d1,d0
  1848.     blt    not_iff    
  1849.  
  1850.     move.l    iff,a0
  1851.     move.l    #"CMAP",d0
  1852.     bsr    findhunk
  1853.     cmp.l    #-1,a0
  1854.     beq    not_iff
  1855.     bsr    decode_iff_cmap    
  1856.     
  1857.     move.l    iff,a0
  1858.     move.l    #"BODY",d0
  1859.  
  1860.     lea    screen1,a3
  1861.  
  1862.     bsr    findhunk
  1863.     cmp.l    #-1,a0
  1864.     beq    not_iff
  1865.     bsr    iff_body
  1866.  
  1867.     lea    iff_cmap,a0
  1868.     lea    cmap+2,a1
  1869.     move.w    iff_colours,d0
  1870.     sub.w    #1,d0
  1871. .cmaploop
  1872.     move.w    (a0)+,(a1)
  1873.     add.l    #4,a1
  1874.     dbf    d0,.cmaploop
  1875.  
  1876.     move.l    #screen1,d0
  1877.     move.l    iff_bmpsize,d1
  1878.     
  1879.     move.w    d0,bitplane0_lo
  1880.     swap    d0
  1881.     move.w    d0,bitplane0_hi
  1882.     swap    d0
  1883.     add.l    d1,d0
  1884.     move.w    d0,bitplane1_lo
  1885.     swap    d0
  1886.     move.w    d0,bitplane1_hi
  1887.     swap    d0
  1888.     add.l    d1,d0
  1889.     move.w    d0,bitplane2_lo
  1890.     swap    d0
  1891.     move.w    d0,bitplane2_hi
  1892.     swap    d0
  1893.     add.l    d1,d0
  1894.     move.w    d0,bitplane3_lo
  1895.     swap    d0
  1896.     move.w    d0,bitplane3_hi
  1897.     swap    d0
  1898.     add.l    d1,d0
  1899.     move.w    d0,bitplane4_lo
  1900.     swap    d0
  1901.     move.w    d0,bitplane4_hi
  1902.  
  1903.     moveq    #0,d0
  1904.     move.b    iff_depth,d0
  1905.     asl.w    #8,d0
  1906.     asl.w    #4,d0
  1907.     or.w    #$0200,d0
  1908.     move.w    d0,iff_res+2
  1909.  
  1910.     rts
  1911.  
  1912. not_iff:
  1913.     move.w    #$fff,$dff180
  1914.  
  1915.     rts
  1916.  
  1917.     *************************************************************
  1918.  
  1919. decode_iff_cmap:
  1920.     
  1921.     move.l    4(a0),d0
  1922.     divu    #3,d0
  1923.     move.w    d0,iff_colours
  1924.  
  1925.     sub.w    #1,d0
  1926.     add.l    #8,a0
  1927.     lea    iff_cmap,a1
  1928. cmap_loop:        
  1929.     moveq    #0,d2
  1930.     
  1931.     moveq    #0,d1
  1932.     move.b    0(a0),d1
  1933.     asl.w    #4,d1
  1934.     or.w    d1,d2    
  1935.     moveq    #0,d1
  1936.     move.b    1(a0),d1
  1937.     or.w    d1,d2    
  1938.     moveq    #0,d1
  1939.     move.b    2(a0),d1
  1940.     lsr.w    #4,d1
  1941.     or.w    d1,d2    
  1942.  
  1943.     move.w    d2,(a1)+            ; store cmap
  1944.     add.l    #3,a0            ; next colour
  1945.     dbf    d0,cmap_loop    
  1946.  
  1947.     rts
  1948.  
  1949.     *************************************************************
  1950.  
  1951. iff_body:
  1952.     moveq    #0,d7
  1953.     moveq    #0,d6
  1954.     moveq    #0,d5
  1955.     move.w    iff_width,d5
  1956.     lsr.w    #3,d5
  1957.  
  1958.     move.l    a3,a2
  1959.     
  1960.     lea    8(a0),a1
  1961.     add.l    4(a0),a1
  1962.     add.l    #8,a0    
  1963.     cmp.b    #1,iff_compression
  1964.     beq    do_byterun1
  1965.     
  1966. .err    move.w    $dff006,$dff180
  1967.     bra    .err
  1968.  
  1969. do_byterun1:
  1970.     moveq    #0,d0
  1971.     move.b    (a0)+,d0
  1972.  
  1973.     cmp.b    #128,d0
  1974.     beq    iff_body_end            ; 128=nop
  1975.  
  1976.     bclr    #7,d0
  1977.     beq    iff_not_byterun
  1978.     
  1979.     moveq    #0,d1
  1980.     move.b    (a0)+,d1
  1981.  
  1982.     move.w    #128,d2
  1983.     sub.w    d0,d2
  1984.     move.w    d2,d0
  1985.     add.w    d0,d7
  1986.     add.w    #1,d7
  1987. iff_byterun1
  1988.     move.b    d1,(a2)+    
  1989.     dbf    d0,iff_byterun1
  1990.     bra    iff_body_end
  1991.     
  1992. iff_not_byterun
  1993.     add.w    d0,d7
  1994.     add.w    #1,d7
  1995. iff_not_byterun2
  1996.     move.b    (a0)+,(a2)+    
  1997.     dbf    d0,iff_not_byterun2
  1998. iff_body_end    
  1999.     cmp.w    d5,d7
  2000.     bne    .no_end
  2001.     
  2002.     move.w    #0,d7
  2003.     move.l    a3,a2
  2004.     move.l    iff_bmpsize,d0
  2005.     add.w    #1,d6
  2006.     move.l    d6,d1
  2007.     mulu    d1,d0
  2008.     add.l    d0,a2
  2009.     moveq    #0,d0
  2010.     move.b    iff_depth,d0
  2011.     cmp.w    d6,d0
  2012.     bne    .no_end
  2013.  
  2014.     moveq    #0,d6
  2015.     moveq    #0,d0
  2016.     move.w    iff_width,d0
  2017.     lsr.w    #3,d0
  2018.     add.l    d0,a3
  2019.     move.l    a3,a2    
  2020.  
  2021. .no_end
  2022.     cmp.l    a1,a0
  2023.     blt    do_byterun1    
  2024. .br1fin    
  2025.     rts
  2026.     
  2027.     *************************************************************
  2028.     
  2029. findhunk:
  2030.     lea    8(a0),a1
  2031.     add.l    4(a0),a1
  2032. .findloop
  2033.     cmp.l    a1,a0
  2034.     bge    .cantfind
  2035.     add.l    #2,a0
  2036.     move.l    (a0),d1
  2037.     cmp.l    d0,d1
  2038.     bne    .findloop
  2039.     rts
  2040. .cantfind    
  2041.     move.l    #-1,a0
  2042.     rts
  2043.  
  2044.     ********************************************************
  2045.  
  2046.     
  2047. my_copper:    
  2048. iff_res:        dc.w    $100,$1200    ; 4 bp - lo res
  2049.         dc.w    $104,$a        ; bp control reg
  2050.         dc.w    $108,0        ; bp modulo - odd
  2051.         dc.w    $10a,0        ; bp modulo - even
  2052.         dc.w    $180,0        ; colour 0 to black
  2053.         dc.w    $102,0
  2054.         
  2055.         dc.w    $08e,$2c81    ; bp window start left
  2056.         dc.w    $090,$2cc1    ; bp window bot right
  2057.         dc.w    $94,$d0        ; bp stop horz
  2058.         dc.w    $92,$38
  2059.  
  2060.         dc.w    $120,0,$122,0
  2061.         dc.w    $124,0,$126,0
  2062.         dc.w    $128,0,$12a,0
  2063.         dc.w    $12c,0,$12e,0
  2064.         dc.w    $130,0,$132,0
  2065.         dc.w    $134,0,$136,0
  2066.         dc.w    $138,0,$13a,0
  2067.         dc.w    $13c,0,$13e,0
  2068.         
  2069.         dc.w      $e0
  2070. bitplane0_hi:    dc.w    0,$e2
  2071. bitplane0_lo:    dc.w    0,$e4
  2072. bitplane1_hi:    dc.w    0,$e6
  2073. bitplane1_lo:    dc.w    0,$e8
  2074. bitplane2_hi:    dc.w    0,$ea
  2075. bitplane2_lo:    dc.w    0,$ec
  2076. bitplane3_hi:    dc.w    0,$ee
  2077. bitplane3_lo:    dc.w    0,$f0
  2078. bitplane4_hi:    dc.w    0,$f2
  2079. bitplane4_lo:    dc.w    0
  2080.     
  2081. cmap:        dc.w    $180,$000
  2082.         dc.w    $182,$000
  2083.         dc.w    $184,$000
  2084.         dc.w    $186,$000
  2085.         dc.w    $188,$000
  2086.         dc.w    $18a,$000
  2087.         dc.w    $18c,$000
  2088.         dc.w    $18e,$000
  2089.         dc.w    $190,$000
  2090.         dc.w    $192,$000
  2091.         dc.w    $194,$000
  2092.         dc.w    $196,$000
  2093.         dc.w    $198,$000
  2094.         dc.w    $19a,$000
  2095.         dc.w    $19c,$000
  2096.         dc.w    $19e,$000
  2097.         dc.w    $1a0,$000
  2098.         dc.w    $1a2,$000
  2099.         dc.w    $1a4,$000
  2100.         dc.w    $1a6,$000
  2101.         dc.w    $1a8,$000
  2102.         dc.w    $1aa,$000
  2103.         dc.w    $1ac,$000
  2104.         dc.w    $1ae,$000
  2105.         dc.w    $1b0,$000
  2106.         dc.w    $1b2,$000
  2107.         dc.w    $1b4,$000
  2108.         dc.w    $1b6,$000
  2109.         dc.w    $1b8,$000
  2110.         dc.w    $1ba,$000
  2111.         dc.w    $1bc,$000
  2112.         dc.w    $1be,$000
  2113.                 
  2114.         dc.w    $ffe1,$fffe    ; end of ntsc screen
  2115.         dc.w    $3001,$ff00    ; end of pal screen
  2116.         dc.w    $9c,$8010    ; irq set bits - restart copper
  2117.         dc.w    $ffff,$fffe    ; end of copper list
  2118.  
  2119. oldint:        dc.l    0
  2120. olddma:        dc.l    0
  2121. oldv3:        dc.l    0
  2122. gfxlib:        dc.b    "graphics.library",0
  2123.  
  2124. diskptr:        dc.l    diskmap
  2125.  
  2126. diskmap:    dc.l    "TWAR",$00400,99754,0,$64E50037
  2127.     dc.l    "TWAR",$18A00,112604,0,$F3997123
  2128.     dc.l    "TWAR",$34200,90644,0,$E7B6FA2A
  2129.     dc.l    "TWAR",$4A600,90226,0,$515E2C85
  2130.     dc.l    "TWAR",$60800,111710,0,$E0C89426
  2131.     dc.l    "TWAR",$7BE00,98280,0,$D7A7C441
  2132.     dc.l    "TWAR",$93E00,107450,0,$4758AF44
  2133.     dc.l    -1
  2134.  
  2135.  
  2136.     section    mods,bss_c
  2137.  
  2138. mod_data1:    ds.l    36250
  2139. mod_data2:    ds.l    36250
  2140. workspace:    ds.l    $c80        ; dma for loader
  2141. screen1:        ds.l     10*256*5
  2142.  
  2143.     section    temp,data
  2144.     
  2145. my_mem:        dc.l    0
  2146. mt_data1:    dc.l    mod_data1
  2147. mt_data2:    dc.l    mod_data2
  2148. songended:    dc.l    0
  2149.  
  2150. volumespace:    dc.l    0
  2151. drive:        dc.w    0
  2152. temp:        dc.l    0
  2153. label:        dc.l    0
  2154. looklabel:    dc.l    0
  2155. loadaddress:    dc.l    0
  2156. diskaddress:    dc.l    0
  2157. loadlength:    dc.l    0
  2158.     
  2159. iff_width:    dc.w    0        ; width in pixels
  2160. iff_height:    dc.w    0        ; height in pixels
  2161. iff_bmpsize:    dc.l    0        ; bitmap size
  2162. iff_depth:    dc.b    0        ; no. of bitplanes
  2163. iff_compression:    dc.b    0        ; compresstion type (0=bitmap, 1=byterun1)
  2164. iff_colours:    dc.w    0        ; no., of colours
  2165. iff_maxsize:    dc.l    40*256*5        ; max size allowed for iff pic
  2166. iff_cmap:    dcb.w    32,0        ; buffers for colourmap
  2167. iff:        dc.l    0        ; ptr to iff pic
  2168.  
  2169. main_screen:    incbin    "dh1:techno/main.iff"
  2170.  
  2171.     end
  2172.  
  2173.